package com.ihy.domain;

import lombok.*;
import org.springframework.stereotype.Component;

import javax.persistence.*;
import java.io.Serializable;

/**
 * 角色与权限中间表实体类
 * Entity注解：
 * 指定类是实体。此注解应用于实体类。
 * <p>
 * Table注解:
 * 指定带注解实体的主表。可以使用SecondaryTable或SecondaryTables注解指定其他表。
 * 如果没有为实体类指定表注解，则应用默认值。
 * <p>
 * Getter注解:
 * 创建当前实体类所有的get方法
 * <p>
 * Setter注解:
 * 创建当前实体类所有的set方法
 * <p>
 * ToString注解:
 * 创建当前实体类所有属性的toString方法
 * <p>
 * EqualsAndHashCode注解:
 * 基于相关字段为所有对象继承的equals和hashCode方法生成实现。
 * <p>
 * AllArgsConstructor注解：
 * 生成all args构造函数。all args构造函数要求类中的每个字段都有一个参数。
 * <p>
 * NoArgsConstructor注解：
 * 生成无参数构造函数。如果由于final字段的存在而无法编写此类构造函数，则将生成错误消息。
 * <p>
 * Component注解：
 * 指示带注解的类是“组件”。当使用基于注解的配置和类路径扫描时，这些类被认为是自动检测的候选类。
 * 其他类级注解也可以被视为标识组件，通常是一种特殊类型的组件：例如@Repository注解或AspectJ的@Aspect注解。
 * <p>
 * Embeddable注解：
 * 指定一个类，其实例存储为所属实体的内在部分，并共享该实体的标识。嵌入对象的每个持久属性或字段都映射到实体的数据库表。
 * 注意，瞬态注解可用于指定可嵌入类的非持久状态。
 * <p>
 * IdClass注解：
 * 指定映射到实体的多个字段或属性的复合主键类。
 * 主键类中的字段或属性的名称与实体的主键字段或属性的名称必须对应，并且它们的类型必须相同。
 */
@Entity
@Table(name = "rj")
@Getter
@Setter
@ToString
@EqualsAndHashCode
@AllArgsConstructor
@NoArgsConstructor
@Component
@Embeddable
@IdClass(Rj.class)
public class Rj implements Serializable {
    /**
     * Id注解：
     * 指定实体的主键。应用Id注解的字段或属性应该是以下类型之一：任何Java基元类型；任何基元包装类型；字符串；日期类型; java.sql.Date日期; java.math.BigDecimal文件; java.math.BigInteger文件.
     * 假定实体主键的映射列是主表的主键。如果未指定列注解，则假定主键列名是主键属性或字段的名称。
     * <p>
     * Column注解：
     * 指定持久属性或字段的映射列。如果未指定列注解，则应用默认值。
     */
    @Id
    @Column(name = "jurisdictionid")
    private int id;
    @Id
    @Column(name = "roleid")
    public int roleId;
}
